/*
 * Lista.h
 *
 *  Created on: Mar 24, 2011
 *      Author: Francisco
 */

#ifndef LISTA_H
#define LISTA_H

#include "Nodo.h"
#include "IteradorLista.h"
#include <iostream>

template<class T> class Lista {

private:

	Nodo<T>* primero;

	Nodo<T>* ultimo;

public:

	Lista() {
		this->setPrimero(NULL);
		this->setUltimo(NULL);
	}

	virtual ~Lista() {
		IteradorLista<T> iterador = this->iterador();
		while (iterador.tieneSiguiente()) {
			iterador.remover();
		}
	}

	bool estaVacia() {
		return (this->getPrimero() == NULL);
	}

	unsigned int size() {
		unsigned int elementos = 0;
		IteradorLista<T> unIterador = this->iterador();

		while (unIterador.tieneSiguiente()) {
			elementos++;
			unIterador.siguiente();
		}
		return elementos;
	}

	void agregar(T dato) {
		IteradorLista<T> iterador = this->iterador();
		while (iterador.tieneSiguiente()) {
			iterador.siguiente();
		}
		iterador.insertar(dato);
	}

	IteradorLista<T> iterador() {
		IteradorLista<T> unIterador(this);
		return unIterador;
	}

private:

	Nodo<T>* getPrimero() {
		return this->primero;
	}

	void setPrimero(Nodo<T>* nodo) {
		this->primero = nodo;
	}

	Nodo<T>* getUltimo() {
		return this->ultimo;
	}


	void setUltimo(Nodo<T>* nodo) {
		this->ultimo = nodo;
	}

	friend class IteradorLista<T> ;
};

#endif
